package main

import "fmt"

// 我们知道对于一个结构体来说，让这个结构体实现了某个接口，这个结构体的指针就实现了某个接口
type eat interface {
	lunch() string
}

type sleep interface {
	bed() string
}

type person struct {
	name string
	age  int
}

// 这是一个person类型的接受者
func (r person) lunch() string {
	return fmt.Sprint(r.name, "is eating")
}

func living(e eat) {
	fmt.Println(e.lunch())
}

//func main() {
//	p := person{"小明",18}
//	living(p)
//	// 如果传入p的指针也是可以接受的，说明person结构体的指针也实现了eat接口
//	living(&p)
//
//	// 我们首先获取接口类型的变量
//	// 因为结构体person已经实现了living接口，所以他的返回值也可以看作一个接口类型的变量
//	var flower eat = person{"小花",17}
//	living(flower) // 正确运行
//	// 现在我们获取接口类型的指针
//	//fp := &flower
//	//living(fp)  // 这里编译就会报错：cannot use fp (type *eat) as type eat in argument to living: *eat is pointer to interface, not interface
//	// living方法接受的是接口类型的eat，而不是eat的指针类型
//	// 所以说接口的指针类型没有实现自己本身的接口 。 thinking here
//}
